static int do_boot_cpu(int apicid, int cpu)
{
- unsigned long boot_error;
- int timeout, rc = 0;
+ int timeout, boot_error = 0, rc = 0;
unsigned long start_eip;
/*
smpboot_setup_warm_reset_vector(start_eip);
/* Starting actual IPI sequence... */
- boot_error = wakeup_secondary_cpu(apicid, start_eip);
+ if ( !tboot_in_measured_env() || tboot_wake_ap(apicid, start_eip) )
+ boot_error = wakeup_secondary_cpu(apicid, start_eip);
if ( !boot_error )
{
printk(" shutdown_entry: 0x%08x\n", tboot_shared->shutdown_entry);
printk(" tboot_base: 0x%08x\n", tboot_shared->tboot_base);
printk(" tboot_size: 0x%x\n", tboot_shared->tboot_size);
+ if ( tboot_shared->version >= 6 )
+ printk(" flags: 0x%08x\n", tboot_shared->flags);
/* these will be needed by tboot_protect_mem_regions() and/or
tboot_parse_dmar_table(), so get them now */
panic("Memory integrity was lost on resume (%d)\n", error);
}
+int tboot_wake_ap(int apicid, unsigned long sipi_vec)
+{
+ if ( g_tboot_shared->version >= 6 &&
+ (g_tboot_shared->flags & TB_FLAG_AP_WAKE_SUPPORT) )
+ {
+ g_tboot_shared->ap_wake_addr = sipi_vec;
+ g_tboot_shared->ap_wake_trigger = apicid;
+ return 0;
+ }
+ return 1;
+}
+
/*
* Local variables:
* mode: C
typedef struct __packed {
/* version 3+ fields: */
uuid_t uuid; /* {663C8DFF-E8B3-4b82-AABF-19EA4D057A08} */
- uint32_t version; /* Version number; currently supports 0.4 */
+ uint32_t version; /* Version number; currently supports 0.6 */
uint32_t log_addr; /* physical addr of tb_log_t log */
uint32_t shutdown_entry; /* entry point for tboot shutdown */
uint32_t shutdown_type; /* type of shutdown (TB_SHUTDOWN_*) */
/* version 4+ fields: */
/* populated by tboot; will be encrypted */
uint8_t s3_key[TB_KEY_SIZE];
+ /* version 5+ fields: */
+ uint8_t reserved_align[3]; /* used to 4byte-align num_in_wfs */
+ uint32_t num_in_wfs; /* number of processors in wait-for-SIPI */
+ /* version 6+ fields: */
+ uint32_t flags;
+ uint64_t ap_wake_addr; /* phys addr of kernel/VMM SIPI vector */
+ uint32_t ap_wake_trigger; /* kernel/VMM writes APIC ID to wake AP */
} tboot_shared_t;
#define TB_SHUTDOWN_REBOOT 0
#define TB_SHUTDOWN_S3 3
#define TB_SHUTDOWN_HALT 4
+#define TB_FLAG_AP_WAKE_SUPPORT 0x00000001 /* kernel/VMM use INIT-SIPI-SIPI
+ if clear, ap_wake_* if set */
+
/* {663C8DFF-E8B3-4b82-AABF-19EA4D057A08} */
#define TBOOT_SHARED_UUID { 0x663c8dff, 0xe8b3, 0x4b82, 0xaabf, \
{ 0x19, 0xea, 0x4d, 0x5, 0x7a, 0x8 } };
int tboot_parse_dmar_table(acpi_table_handler dmar_handler);
int tboot_s3_resume(void);
void tboot_s3_error(int error);
+int tboot_wake_ap(int apicid, unsigned long sipi_vec);
#endif /* __TBOOT_H__ */